home *** CD-ROM | disk | FTP | other *** search
/ Computer Select (Limited Edition) / Computer Select.iso / msj / v06n06 / intnat.exe / KEY.EXE / KEYMAPNT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-01  |  6.5 KB  |  246 lines

  1. /* 
  2.  * Initialization segment for the KEYMAP program
  3.  * This code is discarded after it is used.
  4.  *
  5.  * Copyright (c) 1991 by Peter Belew and William S. Hall
  6.  */
  7.  
  8. #define NOCOMM
  9. #define NOKANJI
  10. #define NOATOM
  11. #define NOSOUND
  12. #include <windows.h>
  13. #include <string.h>
  14. #include "keymap.h"
  15. #include "winutils.h"
  16.  
  17. /* local function declarations */
  18. static BOOL NEAR RegisterWindowClass(HANDLE);
  19. static void NEAR GetPrevInstanceData(HANDLE);
  20. static HWND NEAR MakeAndShowMainWnd(HANDLE, HANDLE, int);
  21. static BOOL NEAR RegisterKeyClass(HANDLE hInstance);
  22.  
  23. /* local variable */
  24. char *keyclass = "KEYWINDOW";
  25.  
  26. /* This routine is FAR since it is called from another segment */
  27. BOOL FAR InitProgram(HANDLE hInstance, HANDLE hPrevInstance,
  28.              LPSTR lpszCmdLine, int cmdShow)
  29. {
  30.     hInst = hInstance;
  31.     
  32.   /* if this is the first instance of the program ... */
  33.     if (!hPrevInstance) {
  34.      /* register the window */
  35.     if (!RegisterWindowClass(hInstance))
  36.         return FALSE;
  37.     if (!RegisterKeyClass(hInstance))
  38.         return FALSE;
  39.     }
  40.  
  41.   /* A previous instance exists so get some data from there */
  42.     else
  43.     GetPrevInstanceData(hPrevInstance);
  44.  
  45.   /* Create and show the window */
  46.     if ((hWndMain=MakeAndShowMainWnd(hInstance,hPrevInstance,cmdShow)) == NULL)
  47.     return FALSE;
  48.  
  49.     return TRUE;
  50. }
  51.  
  52. /* Register main window class */
  53. static BOOL NEAR RegisterWindowClass(HANDLE hInstance)
  54. {
  55.  
  56.     WNDCLASS WndClass;
  57.  
  58.   /* Load the name string from resources */
  59.     LoadString(hInstance,IDS_APPNAME,szAppName,sizeof(szAppName));
  60.     memset(&WndClass, 0, sizeof(WndClass));
  61.  
  62.   /* fill the structure */    
  63.     WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  64.     WndClass.hIcon = LoadIcon(hInstance, szAppName);
  65.     WndClass.lpszMenuName = (LPSTR)szAppName;
  66.     WndClass.lpszClassName = (LPSTR)szAppName;
  67.     WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  68.     WndClass.hInstance = hInstance;
  69.     WndClass.style = CS_VREDRAW | CS_HREDRAW;
  70.     WndClass.lpfnWndProc = MainWndProc;
  71.  
  72.     return RegisterClass(&WndClass);
  73. }
  74.  
  75. /* register key window class */
  76. static BOOL NEAR RegisterKeyClass(HANDLE hInstance)
  77. {
  78.  
  79.     WNDCLASS WndClass;
  80.  
  81.     memset(&WndClass, 0, sizeof(WndClass));
  82.     
  83.   /* fill the structure */    
  84.     WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  85.     WndClass.hIcon = NULL;
  86.     WndClass.lpszMenuName = NULL;
  87.     WndClass.lpszClassName = (LPSTR)keyclass;
  88.     WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  89.     WndClass.hInstance = hInstance;
  90.     WndClass.style = CS_VREDRAW | CS_HREDRAW;
  91.     WndClass.lpfnWndProc = KeyWndProc;
  92.  
  93.     return RegisterClass(&WndClass);
  94. }
  95.  
  96. /* If this not the first instance, we can retrieve static data
  97.    from a previous invocation of the program
  98. */
  99. static void NEAR GetPrevInstanceData(HANDLE hInstance)
  100. {
  101.     GetInstanceData(hInstance, szAppName, sizeof(szAppName));
  102. }
  103.  
  104. /* Create the window, making sure that its position and size
  105.    are suitable for the display.
  106. */
  107. static HWND NEAR MakeAndShowMainWnd(HANDLE hInstance,
  108.                     HANDLE hPrevInstance,int cmdShow)
  109. {
  110.  
  111.     char szTitle[50];
  112.     HWND hWnd;
  113.  
  114.     LoadString(hInstance, IDS_TITLE, szTitle, sizeof(szTitle));
  115.  
  116.   /* create the window, resize later */
  117.     hWnd = CreateWindow(szAppName,
  118.             szTitle,
  119.             WS_OVERLAPPEDWINDOW,
  120.             0,0,0,0,
  121.             NULL,
  122.             NULL,
  123.             hInstance,
  124.             NULL);
  125.  
  126.   /* if successful, display the window and show success */
  127.     if (hWnd) {
  128.         ShowWindow(hWnd, cmdShow);
  129.         UpdateWindow(hWnd);
  130.     }
  131.     return hWnd;
  132. }
  133.  
  134. /* Generate the key windows */
  135. void FAR MainWndCreate(HWND hWnd)
  136. {
  137.     register int i;
  138.     HDC hDC;
  139.     TEXTMETRIC tm;
  140.     int x, y;
  141.     int cx, cy;
  142.     int offset;
  143.     int sc;
  144.     DWORD tl;
  145.     HWND hChild;
  146.  
  147.     KeyColor = IDM_GRAY;    /* set the key color variable */
  148.  
  149.     hDC = GetDC(hWnd);        /* get system font size */
  150.     tl = GetTextExtent(hDC, "@ @", 3); /* get extent of some fat characters */
  151.     GetTextMetrics(hDC, &tm);
  152.     ReleaseDC(hWnd, hDC);
  153.     cwidth = tm.tmAveCharWidth;        /* save width and height */
  154.     cheight = tm.tmHeight + tm.tmExternalLeading;    
  155.  
  156.     cx = LOWORD(tl);      /* try to be device independent */
  157.     cxborder = GetSystemMetrics(SM_CXBORDER);
  158.     cyborder = GetSystemMetrics(SM_CYBORDER);
  159.     cy = 2 * cheight + 4 * cyborder;
  160.     x = cx + cwidth / 2;
  161.  
  162.     /* Create the key windows.  Use the keyboard scan code as the
  163.        key window id.  Lots of magic numbers here as we use our
  164.        knowledge of the extended keyboard scan codes to do 
  165.        the right thing */
  166.     for (i = 0; i < MAXKEYS ; i++) {
  167.     switch (i) {
  168.         case 0:            /* first letter key */
  169.         sc = 41;
  170.             y = cheight;
  171.             offset = cwidth / 2;
  172.             break;
  173.         case 1:            /* start in with the numbers */
  174.         sc = 2;
  175.         break;
  176.         case 13:            /* moving to next row */
  177.         offset =  x + cx / 2 - i * x;
  178.         y += cy + cheight / 2;
  179.         sc = 16;
  180.         break;
  181.         case 25:            /* going to third row */
  182.         offset = x + cx - i * x;
  183.         y += cy + cheight / 2;
  184.         sc = 30;
  185.         break;
  186.         case 36:            /* fourth row */
  187.         sc = 43;
  188.         break;
  189.         case 37:            /* 102nd key */
  190.         offset = x + cx / 2 - i * x;
  191.         y += cy + cheight / 2;
  192.         sc = 86;
  193.         break;
  194.         case 38:            /* finish 4th row */
  195.         sc = 44;
  196.         break;
  197.     }
  198.     kdata[i].scancode = sc++;
  199.         hChild = CreateWindow(keyclass,
  200.                   "",
  201.                   WS_CHILD | WS_VISIBLE,
  202.                   offset + i * x,
  203.                   y,
  204.                   cx, cy,
  205.                   hWnd,
  206.                   kdata[i].scancode,
  207.                   hInst,
  208.                   NULL);
  209.     if (hChild == NULL) {        /* failed */
  210.         PostMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0L);
  211.         return;
  212.     }
  213.     }
  214.     y += cy + cheight;
  215.     hEdit = CreateWindow("EDIT",      /* create the text window */
  216.              "",
  217.              WS_CHILD | WS_VISIBLE | WS_BORDER | 
  218.              ES_MULTILINE | WS_VSCROLL | ES_AUTOVSCROLL,
  219.              cwidth / 2,
  220.              y,
  221.              14 * x - cwidth,
  222.              6 * cheight,
  223.              hWnd,
  224.              1000,
  225.              hInst,
  226.              NULL);
  227.  
  228.     if (hEdit) {    /* subclass the window */
  229.         fpLocalEditWndProc = 
  230.         MakeProcInstance((FARPROC)LocalEditWndProc,hInst);
  231.     if (fpLocalEditWndProc)
  232.             fpEditWndProc = (FARPROC)SetWindowLong(hEdit,
  233.                                      GWL_WNDPROC,
  234.                                      (LONG)fpLocalEditWndProc);
  235.     }
  236.     else {    /* failed */
  237.     PostMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0L);
  238.     return;
  239.     }
  240.   /* now resize the main window */
  241.     MoveWindow(hWnd, GetSystemMetrics(SM_CXSIZE),
  242.              GetSystemMetrics(SM_CYSIZE), 
  243.              14 * x + cwidth, y + 10 * cheight, TRUE);
  244.     ModifyWindowsTitle(hWnd);  /* fix up the title with the keyboard name */
  245. }
  246.